package core

import (
	"fmt"
	"strconv"
	"sync"
	"zinx_websokect_poker/zinx/ziface"
)

const (
	Snil = iota		//留空
	Gaming			//游戏中
	OnTable			//在桌子上
	OffLine			//下线
	Idle			//空闲
)

//玩家对象  playid, 金币，token，钻石，昵称，connID， 手牌，底牌。
type Player struct {
	Pid 		uint32				//玩家ID
	Conn 		ziface.IWSConnection 	//当前玩家的连接
	token 		string				//玩家token，请求后台用
	Gold 		int32					//玩家当前的金币
	Diamond 	int32				//玩家的充值钻石
	Status  	int32				//状态：
	Nickname 	string
	Mobile 		string
	Uid			uint32
	OutId		int64
	Account		string
	Sex			uint8
	Profile		string
	RoomID		string				// 当前所在房间号，0表示不在房间,用于掉线重连
}

/*
	Player ID 生成器
*/
var PidGen uint32 = 1  //用来生成玩家ID的计数器
var IdLock sync.Mutex //保护PidGen的互斥机制

//创建一个玩家对象
func NewPlayer(conn ziface.IWSConnection) *Player {
	//生成一个PID
	IdLock.Lock()
	id := PidGen
	PidGen++
	IdLock.Unlock()
	nick := "玩家" + strconv.Itoa(int(id))
	p := &Player{
		Pid:  id,
		Uid: id,
		Nickname: nick,
		Sex: 0,
		Conn: conn,
	}

	PlayerMgrObj.Add(p)

	return p
}

func (p *Player)  SyncPid(){
	data := "Pid:" + strconv.Itoa(int(p.Pid))

	p.SendMsg(1, []byte(data))
}

//玩家下线
func (p *Player) LostConnection(){

	PlayerMgrObj.RemovePlayerByPid(p.Pid)

}

/*
	发送消息给客户端，
	主要是将pb的protobuf数据序列化之后发送
*/
//func (p *Player) SendMsg(msgId uint32, data proto.Message) {
//	//fmt.Printf("before Marshal data = %+v\n", data)
//	//将proto Message结构体序列化
//	msg, err := proto.Marshal(data)
//	if err != nil {
//		fmt.Println("marshal msg err: ", err)
//		return
//	}
//	//fmt.Printf("after Marshal data = %+v\n", msg)
//
//	if p.Conn == nil {
//		fmt.Println("connection in player is nil")
//		return
//	}
//
//	//调用Zinx框架的SendMsg发包
//	if err := p.Conn.SendMsg(msgId, msg); err != nil {
//		fmt.Println("Player SendMsg error !")
//		return
//	}
//
//	return
//}


/*
	发送消息给客户端，
*/
func (p *Player) SendMsg(msgId uint32, data []byte) {
	//fmt.Printf("before Marshal data = %+v\n", data)

	if p.Conn == nil {
		fmt.Println("connection in player is nil")
		return
	}
	fmt.Println("发送消息给客户端: ",msgId)
	//调用Zinx框架的SendMsg发包
	if err := p.Conn.WriteMessage(data); err != nil {
		fmt.Println("Player SendMsg error !")
		return
	}

	return
}
